/**
 * 
 * win10 - `64位`  - 操作系统版本号: `18363.720`
 *    window系统下，使用 ` npm run build-win/build-win-x `
 *    这个应该是NodeJS问题
 * 
 * ------------------------------------------------------
 * 使用nodejs cli 进行webpack打各种目录下的包
 *
 * NodeJS API
 * http://nodejs.cn/api/child_process.html
 *
 * webpack 打包方式 1 : 配合 package.json -> scripts
 *                 2 : 请移步看: 01-webpack的起步: webpack.config.js
 * -------------------------------------
 * npm run build <可无/第一个目录下>      <可无/0:使用webpack-cli.js/1:使用webpack.config.js>
 * 例如
 * npm run build 1                       0/1
 * -------------------------------------
 *
 * npm run build    === npm run build 1 === npm run build 1 0
 * npm run build 2  0/1
 * npm run build 3  0/1
 *
 * -------------------------------------
 *
 * 为什么要写 2种，打包方式呢？？
 *   因为：配置文件多了，想放到一个文件下管理，就需要不同的命令
 *
 *   文件下的好处： 1、不影响 根 目录结构
 *                 2、配置文件统一管理
 *                 3、不同环境、不同渠道 => 输出不同的包 (特别是加 壳)
 */

//nodejs 内部
const { exec, execFile } = require("child_process");

const cli_config_paths = [
  {
    // ----------【 0 】--------
    fixedUse: [
      //入口文件(主要的，而他内部代码引用的webpack会自动放到 输出文件里)
      "./01-webpack的使用/01-webpack的起步/src/main.js",

      //输出文件
      "./01-webpack的使用/01-webpack的起步/dist/bundle.js"
    ],
    config: "./01-webpack的使用/01-webpack的起步/webpack.config.js"
  },
  {
    // ----------【 1 】--------
    fixedUse: [
      "./01-webpack的使用/02-webpack的配置/src/main.js",
      "./01-webpack的使用/02-webpack的配置/dist/bundle.js"
    ],
    config: "./01-webpack的使用/02-webpack的配置/webpack.config.js"
  },
  {
    // ----------【 2 】--------
    fixedUse: [
      //这个 不支持 webpack-loader 需要看看
      "./01-webpack的使用/03-webpack的-loader/src/js/main.js",
      "./01-webpack的使用/03-webpack的-loader/dist/bundle.js",
    ],
    config: `./01-webpack的使用/03-webpack的-loader/webpack.config.js`
  }
];

const argv = process.argv;

if (argv.length < 2) {
  argv.push(1);
}

if (argv.length < 3) {
  argv.push(0);
}

let argv2 = argv[2];
let argv2Config = argv[3];

let numArgv = Number(argv2) || 1;
let numArgvConfig = Number(argv2Config) || 0;

if (numArgv > cli_config_paths.length) {
  throw new Error("webpack.config.js 参数不对", argv);
} else {
  toStart(cli_config_paths[numArgv - 1], numArgvConfig);
}

//根据配置 - 选择 执行那个方法
function toStart(obj = {}, select = 0) {
  if (select == 0) {
    run_exec(obj.fixedUse);
  } else {
    run_webpack_config(obj.config);
  }
}


// 打包方式 一, 执行 手动把需要打包的js文件 输出到 dist/ 下
function run_exec(argv = []) {
  console.log("run_exec().argv=", argv);
  let shell_code = [];
  shell_code = shell_code.concat(argv);
  // console.log('shell_code=>', shell_code)
  console.log("");
  execFile(
    "./node_modules/.bin/webpack",
    shell_code,
    (error, stdout, stderr) => {
      if (error) {
        console.error(`执行出错: ${error}`);
        return;
      }
      console.log(`stdout: ${stdout}`);
      console.log(`stderr: ${stderr}`);
    }
  );
}


// 打包方式 二 ：执行目录下 webpack.config.js
function run_webpack_config(path) {
  let shell_code = "./node_modules/.bin/webpack --define process.env.NODE_ENV='production' -p --config " + path;
  // let shell_code = "./node_modules/.bin/webpack --define process.env.NODE_ENV='development' -p --config " + path;
  console.log("run_webpack_config=> ", shell_code);
  exec(shell_code, (error, stdout, stderr) => {
    if (error) {
      // 不知道为什么会到这里
      console.error(`执行的错误: ${error}`);
      return;
    }
    console.log(`stdout: ${stdout}`);
    console.error(`stderr: ${stderr}`);
  });
}